<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>165实例化过程详解</title>
</head>

<body>
  <h1>165实例化过程详解</h1>
  <script>
    /*
      一、new实例化的详细过程
        1 创建一个新对象(分配一块内存空间)。

        2 将该新对象的原型设置为构造函数的prototype。

        3 将构造函数的this指向新对象。

        4 返回新对象
    */
    function objectFactory() {
      let newObject = null;
      let constructor = Array.prototype.shift.call(arguments);
      console.log('constructor=>', constructor)
      let result = null;
      // 判断参数是否是一个函数
      if (typeof constructor !== "function") {
        console.error("type error");
        return;
      }
      // 新建一个空对象，对象的原型为构造函数的 prototype 对象
      newObject = Object.create(constructor.prototype);
      // 将 this 指向新建对象，并执行函数
      result = constructor.apply(newObject, arguments);
      // 判断返回对象
      let flag = result && (typeof result === "object" || typeof result === "function");
      // 判断返回结果
      return flag ? result : newObject;
    }
    // 使用方法
    function Animal() {

    }
    console.log(objectFactory(Animal))
  </script>
</body>

</html>